import React from 'react';
import PropTypes from 'prop-types';
import { connect } from 'dva';
import { FormItemLayout, ComplexDateC } from '../../form';
import { message } from 'antd';
import moment from 'moment';

class HoldDateRangeC extends React.PureComponent {
  // props默认值
  static defaultProps = {
    title: '日期区间', // 默认名称
    initialValue: undefined, // 无默认值(type:下拉index，beginDate：开始时间，endDate：结束时间)
    helper: '', // 下拉框提示信息，默认无提示信息
    onRef: () => {}, // 本组件的引用
    formItemLayout: FormItemLayout, // 布局
    labalWrap: false, // 默认title不换行
    flag: '2', // 1持仓最新日期 2资金+持仓的最新日期
    defaultType: '4', // 默认近一年 0: 用户自定义时间区间1: 近一个月 2: 近三个月 3: 近六个月 4: 近一年 5: 近三年 6: 成立以来 )
    productCode: undefined, // 产品Code 必填
    barraArgs: null, // barra工作台请求 还是绩效分析的
    endOnChange: () => {}, // 结束时间变更事件
    disabledProps: false, // 是否禁用
    initialDisabled: false, // 初始化时 是否请求数据
  };

  constructor(props) {
    super(props);
    this.state = {
      disabled: true, // 默认禁用
      hasDataBD: '', // 默认有数据的起始时间为''，不纳入起止时间计算
      hasDataED: '', // 默认有数据的结束时间为''，不纳入起止时间计算
    };
  }

  componentDidMount() {
    // 父组件对本组件的引用
    this.props.onRef(this);
    if (this.props.disabledProps) return; // 只做展示不请求
    if (this.props.initialDisabled) {
      // 初始化 不请求数据
      this.setState({
        disabled: false,
      });
      return;
    }
    if (this.props.productCode) {
      // 初始化就有值 也需要请求
      this.setState(
        {
          productCode: this.props.productCode,
        },
        () => {
          this.selOnChange(this.props.defaultType);
        },
      );
    }
  }

  UNSAFE_componentWillReceiveProps(nextProps) {
    if (nextProps.disabledProps) return; // 只做展示不请求
    if (nextProps.productCode != this.props.productCode) {
      this.setState(
        {
          productCode: nextProps.productCode,
        },
        () => {
          this.selOnChange(this.props.defaultType);
        },
      );
    }
  }

  // 时间区间选择改变事件
  selOnChange = (value) => {
    const { dispatch, barraArgs, endOnChange } = this.props;
    if (!this.state.productCode) {
      // 重置到初始化

      this.state.COMPLEXDATE.setSelctAndDate('', '', '');
      this.setState({
        disabled: true,
      });
      return;
    }
    const args = barraArgs ? barraArgs : {};
    // barra工作台过来的 请求接口不一样
    dispatch({
      type: barraArgs ? 'holdDateRangeM/queryDateRangeBarra' : 'holdDateRangeM/queryDateRange',
      payload: {
        portfolioCode: this.state.productCode,
        productCode: this.state.productCode,
        timeRange: barraArgs ? (value === '0' ? '6' : value) : value,
        ...args,
        flag: barraArgs ? barraArgs.flag : this.props.flag, // 这里的flag 给绩效分析那边使用
      },
      callback: (res) => {
        const preDate = moment().subtract(1, 'day'); // 前一个自然日
        if (res?.code == 0) {
          const { data } = res;
          if (!data) {
            message.warning('该产品无开始日期!');
            this.state.COMPLEXDATE.setSelctAndDate('', '', '');
            this.setState({
              disabled: true,
            });
            return;
          }
          // 后端给的结果 结束日期 拿到之后 和前一个自然日做比较 取最早的日期(barra工作台除外)
          if (!barraArgs) data.endDate = moment(data.endDate).format('YYYYMMDD') - preDate.format('YYYYMMDD') > 0 ? preDate.format('YYYYMMDD') : data.endDate;
          // 区分自定义和非自定义状态
          if (value !== '0') {
            if (data.beginDate == '00000000') {
              data.beginDate = null;
            }
            this.state.COMPLEXDATE.setSelctAndDate(value, moment(data.beginDate), moment(data.endDate));
            this.setState({
              beginDate1: data.beginDate == '00000000' ? undefined : moment(data.beginDate),
              endDate1: data.endDate,
            });
            endOnChange(moment(data.endDate)); // 传递结束时间给父组件
          } else {
            // 自定义状态 不进行赋值
            this.state.COMPLEXDATE.setSelctAndDate(value, null, null);
            if (this.props.disabledEndForm) {
              // 禁用结束日期 就要给结束日期赋值
              this.state.COMPLEXDATE.setSelctAndDate(value, null, moment(data.endDate));
            }
            this.setState({
              hasDataBD: data.beginDate == '00000000' ? undefined : moment(data.beginDate),
              hasDataED: moment(data.endDate),
            });
            endOnChange(moment(data.endDate)); // 传递结束时间给父组件
          }
        } else {
          message.warning(res?.msg || '该产品无开始时间');
          // 如果有报错，就按照自定义赋值 不做限制
          this.state.COMPLEXDATE.setSelctAndDate('0', null, null);
          endOnChange(); // 传递结束时间给父组件
        }
        this.setState({
          disabled: false,
        });
      },
    });
  };

  render() {
    const { endOnChange, disabledEndForm, labalWrap, helper, formItemLayout, title, form, startIndex, endIndex, selectIndex, initialValue } = this.props;
    return (
      <ComplexDateC
        form={form}
        formItemLayout={formItemLayout}
        selectIndex={selectIndex}
        startIndex={startIndex}
        endIndex={endIndex}
        title={title}
        labalWrap={labalWrap}
        helper={helper}
        initialValue={initialValue}
        hasDataBD={this.state.hasDataBD}
        hasDataED={this.state.hasDataED}
        disabled={this.state.disabled}
        disabledEndForm={disabledEndForm}
        selOnChange={this.selOnChange}
        startOnChange={() => {}}
        endOnChange={endOnChange}
        onRef={(ref) => this.setState({ COMPLEXDATE: ref })}
      />
    );
  }
}

// props默认值
HoldDateRangeC.propsTypes = {
  onRef: PropTypes.func, // 本组件的引用（可用来父组件调用内部方法）
  title: PropTypes.string, // 默认名称
  initialValue: PropTypes.object, // 初始默认值(type:下拉index，beginDate：开始时间，endDate：结束时间)
  helper: PropTypes.oneOfType([
    // 提示帮助信息
    PropTypes.string,
    PropTypes.element,
  ]),
  formItemLayout: PropTypes.object, // 布局
  labalWrap: PropTypes.bool, // 默认title不换行
  flag: PropTypes.string, // 1持仓最新日期 2资金+持仓的最新日期
  defaultType: PropTypes.string, // 默认时间类型 0: 用户自定义时间区间1: 近一个月 2: 近三个月 3: 近六个月 4: 近一年 5: 近三年 6: 成立以来 )
  productCode: undefined, // 产品Code 必填
  disabledEndForm: PropTypes.bool, // 禁用结束日期
  endOnChange: PropTypes.func, // 结束时间变化事件
};

export default connect(({ holdDateRangeM, loading }) => ({ holdDateRangeM, loading }))(HoldDateRangeC);
